package com.entrogy.dao;

import com.alibaba.fastjson.JSONObject;
import com.entrogy.bean.*;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 *   家长信息dao接口
 */
@Repository
public interface ParentMapper {
	/**
	 *  新增家长信息
	 * @param parentVisitorEntity
	 * @return int
	 */
	int insertParent(ParentVisitorEntity parentVisitorEntity);

	/**
	 *   修改家长信息
	 * @param parentVisitorEntity
	 * @return int
	 */
	int updateParent(ParentVisitorEntity parentVisitorEntity);

	/**
	 *    根据家长id  获取家长信息
	 * @param map
	 * @return  list
	 */
	List<Map<String,Object>>  selectParentVisitorEntityById(Map<String,Object>  map);

	/**
	 * 根据电话号码获取家长信息
	 * @param phone
	 * @return
	 */
	@Select("select * from parent_visitor_information where parent_visitor_phone = #{phone} limit 1")
	ParentVisitorEntity getParentByPhone(@Param("phone") String phone);

	@Select("select parent_visitor_name from parent_visitor_information where parent_visitor_id=#{uid}")
    String getParentName(@Param("uid") String uid);

	/**
	 *    根据学生id  获取家长电话号码
	 * @param studentId
	 * @return  list
	 */
	List<String>  findParentPhoneByStudentId(Integer studentId);

	@Select("select parent_visitor_school_code from parent_visitor_information where parent_visitor_id = #{uid}")
    Integer getSchoolCodeByParentId(@Param("uid") String uid);

	@Select("select si.*,ci.class_name as courseName from student_information si " +
			"inner join class_information ci on si.course_id=ci.id and si.school_code=ci.school_code " +
			"where parent1_id = #{pid} or parent2_id = #{pid}")
	List<StudentEntity> getStudentByParentId(@Param("pid") String pid);

	/**
	 * 根据id 获取家长对象
	 * @return
	 */
	ParentVisitorEntity getparentById(@Param(value="uId") String uId);

    @Insert("INSERT INTO pick_record(parent_id,student_id,student_name,start_time,end_time) VALUES(#{uid},#{stuId},#{studentName},#{startTime},#{endTime})")
    int insertPickRecord(@Param("uid") String uid, @Param("stuId") int stuId, @Param("studentName") String studentName,@Param("startTime") Date startTime,@Param("endTime") Date endTime);

    List<JSONObject> ListParentPhonesByStudentId(Integer studentId);

    Integer insertParentPhoneChangeRecord(ParentInformationChangeEntity parentPhoneChangeRecord);

	/**
	 * 通过学生id查找家长信息
	 * @param studentId
	 * @return
	 */
	List<ParentVisitorEntity> listParentByStudentId(Integer studentId);

	/**
	 * 插入学生变更记录
	 * @param studentNewInformation
	 * @return
	 */
	boolean insertStudentPhoneChangeRecord(StudentInformationChangeEntity studentNewInformation);

	/**
	 * 查看家长是否是待审核的信息修改
	 * @param parentId
	 * @return
	 */
    Integer countHasToAudit(@Param(value = "parentId") String parentId, @Param(value = "flag") Integer flag);

    /**
     * 查询家长信息变更字段
     * @param changeId
     * @return
     */
    JSONObject getParentInformationChangeDetail(Integer changeId);

	/**
	 * 更新审核状态
	 * @param changeId
	 * @param agreed
	 * @return
	 */
	Integer updateChangeRecord(@Param(value = "changeId") Integer changeId, @Param(value = "agreed") Integer agreed);

	/**
	 * 查找家长申请更改后的新号码
	 * @param changeId
	 * @return
	 */
	String getNewPhone(Integer changeId);

	/**
	 * 查看学生的家长是否是待审核的信息修改
	 * @param studentId
	 * @return
	 */
	Integer countStudentParentHasToAudit(Integer studentId);

	/**
	 * 查询某个家长的信息变更记录
	 * @param parentId
	 * @return
	 */
	JSONObject getParentInformationChangeList(String parentId);

	/**
	 * 插入验证码
	 * @param verifyCodeEntity
	 * @return
	 */
    Integer insertVerifyCode(VerifyCodeEntity verifyCodeEntity);

    /**
     * 对比验证码
     * @param id
     * @return
     */
    Integer getVerifyById(Integer id);

	/**
	 * 更新验证码使用状态
	 * @param id
	 * @return
	 */
	Integer updateVerifyCodeStatus(Integer id);

	/**
	 * 判断注册的手机号是否处于注册或修改的申请程序中,如果处于变更或者注册状态，返回审核人的电话号码和该记录是新增审核还是注册审核
	 * @param parentPhone
	 * @return
	 */
	JSONObject getParentPhoneChangeStatus(String parentPhone);

	/**
	 * 查询这个学生的家长新增记录
	 * @param studentId
	 * @return
	 */
    List<ParentInformationChangeEntity> listAddParentInformation(Integer studentId);

	/**
	 * 查询该学生有多少个家长
	 * @param studentId
	 * @return
	 */
	JSONObject countParent(Integer studentId);

	/**
	 * 根据家长id查询他孩子们的班主任的电话号码
	 * @param parentId
	 * @return
	 */
    List<String> getClassLeaderPhone(String parentId);

	Integer updateWeiXinInformation(Integer id);

	/**
	 *
	 * @param id
	 * @param newPhone
	 * @return
	 */
	Integer updateWeiXinNewPhone(@Param(value = "id") Integer id, @Param(value = "newPhone") String newPhone);

	/**
	 * 查找重复家长数据
	 * @param schoolCode
	 * @return
	 */
	List<ParentVisitorEntity> listRepeatParent(Integer schoolCode);


	/**
	 * 删除家长
	 * @param parentVisitorId
	 * @return
	 */
	int deleteParent(String parentVisitorId);

	/**
	 * 查询学校的所有家长
	 */
	List<ParentVisitorEntity> listParent(Integer schoolCode);

	/**
	 * 更新家长微信信息
	 * @param parentVisitorEntity
	 * @return
	 */
	int updateParentWeixinInformation(ParentVisitorEntity parentVisitorEntity);

	/**
	 * 查询某个班级的家长
	 * @param schoolCode
	 * @param classId
	 * @return
	 */
	List<ParentVisitorEntity> listClassParent(@Param("schoolCode") Integer schoolCode, @Param("classId") Integer classId);

	/**
	 * 查询某个学校的班级
	 * @param schoolCode
	 * @param gradeId
     * @param classId
     * @return
	 */
	List<ParentClassEntity> listClass(@Param("schoolCode") Integer schoolCode, @Param("gradeId") Integer gradeId, @Param("classId") Integer classId);

	/**
	 * 查询某个班级家长1或者家长2的数量
	 * @param classId
	 * @param schoolCode
	 * @return
	 */
	Integer countClassParent(@Param("classId") Integer classId, @Param("schoolCode") Integer schoolCode, @Param("parentType") Integer parentType);

	/**
	 * 查询某个家长的所有孩子列表
	 * @param uid
	 * @return
	 */
	List<StudentBasicInfoEntity> listStudentByParentId(String uid);

	/**
	 * 查询家长
	 * @param schoolCode
	 * @param gradeId
	 * @param classId
	 * @param name
	 * @return
	 */
	List<Map<String, Object>> listSchoolParent(@Param("schoolCode") String schoolCode, @Param("gradeId") String gradeId, @Param("classId") String classId, @Param("name") String name);

	/**
	 * 查询家长是否已付费
	 * @param parentVisitorId
	 * @return
	 */
    List<PayOrderEntity> listPayOrder(String parentVisitorId);

	/**
	 * 该家长在班级/年级是否有付费记录
	 * @param parentClassId
	 * @param parentVisitorId
	 * @param isGrade
	 * @param schoolCode
	 * @return
	 */
	List<PayOrderEntity> isPayForClassOrGrade(@Param("parentClassId") String parentClassId, @Param("parentVisitorId") String parentVisitorId, @Param("isGrade") Integer isGrade, @Param("schoolCode") Integer schoolCode);

	/**
	 * 查询家长是否为某个孩子付费
	 * @param parentVisitorId
	 * @param studentId
	 * @return
	 */
	PayOrderEntity isPayForStudent(@Param("parentVisitorId") String parentVisitorId, @Param("studentId") Integer studentId);

	/**
	 * 根据openId查询家长id
	 * @param parentOpenId
	 * @return
	 */
	String getParentIdByOpenId(String parentOpenId);

	/**
	 * 分条件更新家长信息
	 * @param newParentName
	 * @param newImageUrl
	 * @param parentId
	 * @return
	 */
	int updateParentDetail(@Param("newParentName") String newParentName, @Param("newImageUrl") String newImageUrl, @Param("parentId") String parentId);

	/**
	 * 查询某个家长小程序登录情况
	 * @param phone
	 * @return
	 */
    JSONObject getParentStatus(@Param("phone") String phone);

	/**
	 * 查询某个用户公众号关注情况
	 * @param phone
	 * @return
	 */
	JSONObject getUserStatus(@Param("phone") String phone);

	/**
	 * 查询家长注册率概览
	 * @param schoolCode
	 * @param gradeId
	 * @param classId
	 * @return
	 */
    List<ParentRegisterEntity> listParentRegisterOverView(@Param("schoolCode") Integer schoolCode, @Param("gradeId") Integer gradeId, @Param("classId") Integer classId);

	/**
	 * 查询家长注册详细
	 * @param schoolCode
	 * @param gradeId
	 * @param classId
	 * @return
	 */
	List<ParentRegisterStudentEntity> listParentRegisterDetail(@Param("schoolCode") Integer schoolCode, @Param("gradeId") Integer gradeId, @Param("classId") Integer classId);

    /**
     * 查询学生家长信息
     * @param schoolCode
     * @param gradeId
     * @param classId
     * @return
     */
    List<ParentStudentInfoEntity> listParentStudentInfo(@Param("schoolCode") Integer schoolCode, @Param("gradeId") Integer gradeId, @Param("classId") Integer classId);

	/**
	 * 查询学校家长数
	 * @param schoolCode
	 * @param gradeId
     * @param classId
     * @return
	 */
	int countSchoolParent(@Param("schoolCode") Integer schoolCode, @Param("gradeId") Integer gradeId, @Param("classId") Integer classId);

	/**
	 * 获取家长登录数据
	 * @param schoolCode
	 * @param gradeId
	 * @param classId
	 * @return
	 */
    int countParentLogin(@Param("schoolCode") Integer schoolCode, @Param("gradeId") Integer gradeId, @Param("classId") Integer classId);

	/**
	 * 查看家长登录到小程序详细（按家长统计）
	 * @param schoolCode
	 * @param gradeId
	 * @param classId
	 * @return
	 */
    List<ParentLoginEntity> listParentLogin(@Param("schoolCode") Integer schoolCode, @Param("gradeId") Integer gradeId, @Param("classId") Integer classId);


	/**
	 * 查询家长
	 * @param parentId
	 * @return
	 */
	ParentBasicEntity getParent(@Param("parentId") String parentId);
}
